home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
mark.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-02-07
|
5KB
|
229 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
/* マークを削除する */
void
mark_erase_mark(int mn)
{
UBYTE l[VERY_LONG_LINE];
UNIT *wp;
int bp;
/*ud("erase",mn,CURRENT_TEXT);*/
if (wp = mark_get_mark(mn,&bp)) { /* 見つかった */
line_get_body(l,wp);
strcpy(&l[bp],&l[bp+2]); /* 2バイト分つぶす */
line_store(wp,l); /* エコーしない */
if (wp == CL) {
line_cl_cl();
work_line_analyze();
}
}
}
/* 与えられた番号のマークを、現在のカーソル位置に設定する */
void
mark_set_mark(int mn)
{
UBYTE l[VERY_LONG_LINE];
register int i;
/*ud("set",mn,CURRENT_TEXT);*/
/*
itoa(mn,l,16);
under_print(l);binkey();
*/
mark_erase_mark(mn);
line_cl_strncpy(l,i = ANALYZE[CPX].BPOS);
l[i] = XCODE_UP;
l[i+1] = XCODE_MARK + mn;
l[i+2] = EOS;
line_cl_strcat(l,i);
line_store(CL,l); /* エコーしない */
line_cl_cl(); /* CL_DATA も更新しておく */
work_line_analyze();
}
/* 与えられた番号のマークのある行を返す */
/* 無い場合は NIL を返す */
/* バイト位置も返す */
/* 見付けた場合、もしも他に XCODE があったなら勝手に「一番最初」に移動する */
UNIT *
mark_get_mark(int mn,int *bp)
{
UNIT *wp;
UBYTE l[VERY_LONG_LINE],d[VERY_LONG_LINE];
register STR p;
register int bc,bc0,bct;
int dummy;
/*ud("get",mn,CURRENT_TEXT);*/
mn += XCODE_MARK;
for(wp = HEAD->ATO;wp != TAIL;wp = wp->ATO) {
line_get_body(l,wp);
p = l;
while(p = (STR) strchr(p,XCODE_UP)) {
if (p[1] == mn) { /* 発見 */
bct = p - l; /* 取り合えずのバイトカウント */
bc = 0;
while(1) {
/* 実体を越える */
bc = line_touch_next_char_x(l,bc0 = bc,&dummy);
if (bc > bct) {
/* bc0 と bc でマークを挟んだ */
if (bct == bc0) { /* マークが先頭だから何もしない */
break;
} else {
strcpy(&l[bct],&l[bct+2]);
/* マークを潰す */
strcpy(d,l);
d[bc0] = XCODE_UP;
d[bc0+1] = mn;
strcpy(&d[bc0+2],&l[bc0]);
line_store(wp,d);/* エコーしない */
if (wp == CL) {
line_cl_cl();
work_line_analyze();
}
break;
}
} else {
/*
printf("[%d][%d]",bc,bct);binkey();
*/
}
}
*bp = bc0;
return(wp);
} else {
p += 2;
}
}
}
return(NIL);
}
/* 指定されたウインドウの */
/* 与えられた番号のマークのある行を返す */
/* 無い場合は NIL を返す */
/* バイト位置も返す */
UNIT *
mark_get_mark_x(int w,int mn,int *bp)
{
UNIT *wp;
UBYTE l[VERY_LONG_LINE];
STR p;
UNIT *X_HEAD,*X_TAIL;
/*ud("get_x",mn,CURRENT_TEXT);*/
X_HEAD = &TDATA[(WDATA[w].WTEXTS)].TEXT_HEADS;
X_TAIL = &TDATA[(WDATA[w].WTEXTS)].TEXT_TAILS;
mn += XCODE_MARK;
for(wp = X_HEAD->ATO;wp != X_TAIL;wp = wp->ATO) {
line_get_body(l,wp);
p = l;
while(p = (STR) strchr(p,XCODE_UP)) {
if (p[1] == mn) { /* 発見 */
*bp = p - l;
return(wp);
} else {
p += 2;
}
}
}
return(NIL);
}
/* 文字列の中にマークコードがあったなら対応するビットを立てて返す */
/* 32ビットだよーん */
UINT
mark_find_mark(STR s)
{
UINT mask = 0;
register STR p;
p = s;
while(p = string_search_xcode(p)) { /* 拡張コードがあった */
p++; /* 次を指す */
if ((XCODE_MARK <= *p) && (*p <= (XCODE_MARKLAST))) { /* マークだ */
mask |= (1 << (*p - XCODE_MARK));
}
p++;
}
return(mask);
}
/* マスクに対応したマークを追加する */
void
mark_cat_mark_str(STR s,UINT mask)
{
register UINT m = 1,bc = 0;
register int i;
i = strlen(s);
for(;mask;m <<= 1,bc++) {
if (mask & m) {
mask ^= m; /* ビットを倒す */
s[i++] = XCODE_UP;
s[i++] = XCODE_MARK + bc;
}
}
s[i] = EOS;
}
/* システムマークを削除する */
void
mark_erase_mark_sys(int mn)
{
UBYTE l[VERY_LONG_LINE];
UNIT *wp;
int bp;
/*ud("erase_sys",mn,CURRENT_TEXT);*/
if (wp = mark_get_mark_sys(mn,&bp)) { /* 見つかった */
line_get_body(l,wp);
strcpy(&l[bp],&l[bp+2]); /* 2バイト分つぶす */
line_store(wp,l); /* エコーしない */
if (wp == CL) {
line_cl_cl();
work_line_analyze();
}
}
}
/* 指定されたウインドウのシステムマークのある行を返す */
/* 無い場合は NIL を返す */
/* バイト位置も返す */
UNIT *
mark_get_mark_sys(int w,int *bp)
{
UNIT *wp;
UBYTE l[VERY_LONG_LINE];
STR p;
UNIT *X_HEAD,*X_TAIL;
int mn;
/*ud("get_sys",mn,CURRENT_TEXT);*/
X_HEAD = &TDATA[(WDATA[w].WTEXTS)].TEXT_HEADS;
X_TAIL = &TDATA[(WDATA[w].WTEXTS)].TEXT_TAILS;
mn = w + XCODE_SYSMARK;
for(wp = X_HEAD->ATO;wp != X_TAIL;wp = wp->ATO) {
line_get_body(l,wp);
p = l;
while(p = (STR) strchr(p,XCODE_UP)) {
if (p[1] == mn) { /* 発見 */
*bp = p - l;
return(wp);
} else {
p += 2;
}
}
}
return(NIL);
}